﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using SegIdenMovilBT.Entidad;
using System.Data;
using SegIdenMovilBT.DataAccess;

namespace SegIdenMovilBT.Datos
{
    public class ClienteDA
    {
        #region --- Constantes Parametros ---
        private const string CODCLIENTE = "CODCLIENTE";
        private const string RAZONSOCIAL = "RAZONSOCIAL";
        private const string RUC = "RUC";
        private const string DIRECCION = "DIRECCION";
        private const string CODREGION = "CODREGION";
        private const string CODPROVINCIA = "CODPROVINCIA";
        private const string CODDISTRITO = "CODDISTRITO";
        private const string TIPODOCUMENTO = "TIPODOCUMENTO";
        private const string NRODOCUMENTO = "NRODOCUMENTO";
        #endregion

        #region --- Metodos Propios ---
        public ListaCliente listarCliente(Cliente cliente)
        {
            ListaCliente listaClientes = null;
            StringBuilder sentenciaSQL = null;

            sentenciaSQL = new StringBuilder();
            sentenciaSQL.Append("SELECT  cli.CODCLIENTE, cli.RAZONSOCIAL, cli.RUC, cli.DIRECCION, cli.CODREGION, ");
            sentenciaSQL.Append("cli.CODPROVINCIA, cli.CODDISTRITO, dis.DESCRIPCION, cli.TIPODOCUMENTO, cli.NRODOCUMENTO, ");
            sentenciaSQL.Append("cli.ESTADO, cli.FECHAREGISTRO ");
            sentenciaSQL.Append("FROM cliente cli ");
            sentenciaSQL.Append("LEFT OUTER JOIN distrito dis ON (cli.CODREGION = dis.CODREGION AND cli.CODPROVINCIA = dis.CODPROVINCIA AND cli.CODDISTRITO = dis.CODDISTRITO) ");
            sentenciaSQL.Append("WHERE (cli.NRODOCUMENTO LIKE '" + cliente.nroDocumento + "' OR " + cliente.nroDocumento + " = '') ");
            sentenciaSQL.Append("AND (cli.RAZONSOCIAL LIKE '" + cliente.razonSocial + "' OR " + cliente.razonSocial + " = '')");
            sentenciaSQL.Append("AND (cli.ESTADO = '" + cliente.estado + "' OR " + cliente.estado + " = '') ");
            sentenciaSQL.Append("AND cli.ESTADO <> 'E' ");
            sentenciaSQL.Append("ORDER BY cli.FECHAREGISTRO ASC");

            // Carga de datos obtenido de la BD
            using (Database db = new Database())
            {
                db.TextoSQL = sentenciaSQL.ToString();

                IDataReader dr = db.obtenerDataReader();

                listaClientes = new ListaCliente();

                while (dr.Read())
                {
                    listaClientes.add(generarEntidadCliente(dr));
                }
            }

            return listaClientes;
        }

        private Cliente generarEntidadCliente(IDataReader dr)
        {
            Cliente clienteObtenido = null;

            clienteObtenido = new Cliente();
            clienteObtenido.codCliente = dr[CODCLIENTE].ToString();
            clienteObtenido.razonSocial = dr[RAZONSOCIAL].ToString();
            clienteObtenido.ruc = dr[RUC].ToString();
            clienteObtenido.direccion = dr[DIRECCION].ToString();

            clienteObtenido.distrito = new Distrito();
            clienteObtenido.distrito.codRegion = Convert.ToInt32(dr[CODREGION]);
            clienteObtenido.distrito.codProvincia = Convert.ToInt32(dr[CODPROVINCIA]);
            clienteObtenido.distrito.codigo = dr[CODDISTRITO].ToString();

            clienteObtenido.tipoDocumento = dr[TIPODOCUMENTO].ToString();
            clienteObtenido.nroDocumento = dr[NRODOCUMENTO].ToString();

            return clienteObtenido;
        }

        public Cliente obtenerClientePorDocumento(Cliente cliente)
        {
            Cliente clienteObtenido = null;
            StringBuilder sentenciaSQL = null;

            sentenciaSQL = new StringBuilder();
            sentenciaSQL.Append("SELECT CODCLIENTE, RAZONSOCIAL, RUC, DIRECCION, CODREGION, ");
            sentenciaSQL.Append("CODPROVINCIA, CODDISTRITO, TIPODOCUMENTO, NRODOCUMENTO, ESTADO, ");
            sentenciaSQL.Append("FECHAREGISTRO ");
            sentenciaSQL.Append("FROM cliente ");
            sentenciaSQL.Append("WHERE TIPODOCUMENTO = '" + cliente.tipoDocumento + "' ");
            sentenciaSQL.Append("AND NRODOCUMENTO = '" + cliente.nroDocumento + "'");

            // Carga de datos obtenido de la BD
            using (Database db = new Database())
            {
                db.TextoSQL = sentenciaSQL.ToString();

                IDataReader dr = db.obtenerDataReader();

                while (dr.Read())
                {
                    clienteObtenido = new Cliente();
                    clienteObtenido.codCliente = dr[CODCLIENTE].ToString();
                    clienteObtenido.razonSocial = dr[RAZONSOCIAL].ToString();
                    clienteObtenido.ruc = dr[RUC].ToString();
                    clienteObtenido.direccion = dr[DIRECCION].ToString();

                    clienteObtenido.distrito = new Distrito();
                    clienteObtenido.distrito.codRegion = Convert.ToInt32(dr[CODREGION]);
                    clienteObtenido.distrito.codProvincia = Convert.ToInt32(dr[CODPROVINCIA]);
                    clienteObtenido.distrito.codigo = dr[CODDISTRITO].ToString();

                    clienteObtenido.tipoDocumento = dr[TIPODOCUMENTO].ToString();
                    clienteObtenido.nroDocumento = dr[NRODOCUMENTO].ToString();
                }
            }

            return clienteObtenido;
        }
        #endregion
    }
}
